package logs

import (
	"fmt"
	"sync"

	"gitee.com/xgotool/sqlite-logs-more/model"
	"gitee.com/xgotool/sqlite-logs-more/service/rootdb"
	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

var db_cache *gorm.DB // 缓存数据库连接
var nums int          // 缓存次数，用于检测connect的连接次数，一旦超过次数以后就进行移除，然后重新连接【用于避免单位时间内存储日志过多】

// 获取日志数据库连接
func Connect() (*gorm.DB, error) {
	if nums > 100 {
		// 超过100次以后就重新获取路径、判断大小是否超出【实际结果为获取101次将cache重置为空，num重置为0】
		if db_cache != nil {
			// if cn, err := db_cache.DB(); err == nil {
			// 	cn.Close()
			// }
			db_cache = nil
		}
		nums = 0
	} else if db_cache != nil {
		nums++
		return db_cache, nil
	}
	path, err := rootdb.GetPath()
	if err != nil {
		return nil, err
	}
	db, err := connect_file(path)
	if err != nil {
		return nil, err
	}
	db_cache = db
	return db_cache, nil
}

type file_conn struct {
	DB  *gorm.DB
	num int
}

var conn_lock sync.Mutex
var conn_file map[string]file_conn = map[string]file_conn{}

// 获取指定文件下的数据库连接
//
//	path	文件地址
func connect_file(path string) (*gorm.DB, error) {
	conn_lock.Lock()
	defer conn_lock.Unlock()
	if len(conn_file) > 100 {
		// 如果缓存的连接超过100个的话，就随机移除部分，剩余50个
		i := 0
		for k, v := range conn_file {
			if i <= 50 {
				continue
			}
			if db, err := v.DB.DB(); err == nil {
				db.Close()
			}
			delete(conn_file, k)
			i++
		}
	}
	if v, ok := conn_file[path]; ok {
		fmt.Println(v.num)
		if v.num < 10 {
			conn_file[path] = file_conn{
				DB:  v.DB,
				num: v.num + 1,
			}
			return v.DB, nil
		}
		if db, err := v.DB.DB(); err == nil {
			db.Close()
		}
	}
	// 获取连接
	conn, err := gorm.Open(sqlite.Open(path))
	if err != nil {
		return nil, err
	}
	conn.AutoMigrate(&model.AppLog{}, &model.PipeLog{}, &model.QuestLog{}, &model.RuntimeLog{})
	conn_file[path] = file_conn{
		DB:  conn,
		num: 0,
	}
	return conn, nil
}
